home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / utilsys / rss14gmd.lha / RSys_1.4gmd / C / List.c < prev    next >
C/C++ Source or Header  |  1996-05-04  |  6KB  |  332 lines

  1. /*
  2.    ***************************************************************************
  3.    *
  4.    * Datei:
  5.    *    RSysList.c
  6.    *
  7.    * Inhalt:
  8.    *
  9.    *      --- Globale Routinen ---
  10.    *
  11.    *    int CountDevices ( long mask );
  12.    *    int CountIntuiObjects ( int typ );
  13.    *    int CountMemory ( void );
  14.    *    int CountNodes ( LIST *list );
  15.    *    int NoEntries ( void );
  16.    *    void KillList ( void );
  17.    *    void RefreshList ( int type );
  18.    *    void RestoreList ( void );
  19.    *    void SaveCurrentList ( void );
  20.    *
  21.    *      --- Lokale  Routinen ---
  22.    *
  23.    *
  24.    * Bemerkungen:
  25.    *    Listenverwaltung von RSys, Zählroutinen und interne Liste.
  26.    *
  27.    * Erstellungsdatum:
  28.    *    07-Jul-93    Rolf Böhme
  29.    *
  30.    * Änderungen:
  31.    *    07-Jul-93    Rolf Böhme    Erstellung
  32.    *
  33.    ***************************************************************************
  34.  */
  35.  
  36. #include "RSys.h"
  37. #include "protos.h"
  38.  
  39.  /*
  40.   * CountIntuiObjects() zählt Screens oder Fenster,
  41.   * abhängig von Typ
  42.   */
  43. int
  44. CountIntuiObjects (int typ)
  45. {
  46.   int wincount = 0, scrcount = 0;
  47.   WINDOW *win;
  48.   SCREEN *scr;
  49.   ULONG lock;
  50.  
  51.   lock = LockIBase (NULL);
  52.  
  53.   for (scr = IntuitionBase->FirstScreen; scr; scr = scr->NextScreen)
  54.     {
  55.       scrcount++;
  56.  
  57.       for (win = scr->FirstWindow; win; win = win->NextWindow)
  58.     wincount++;
  59.     }
  60.  
  61.   UnlockIBase (lock);
  62.  
  63.   return ((typ == SCREENS) ? scrcount : wincount);
  64. }
  65.  
  66.  /*
  67.   * CountDevices() zählt im System angemeldete Devices
  68.   * entsprechend der übergebenen Maske
  69.   */
  70. int
  71. CountDevices (long mask)
  72. {
  73.   int count = 0;
  74.   DOSLIST *dl;
  75.  
  76.   dl = LockDosList (mask | LDF_READ);
  77.  
  78.   while (dl = NextDosEntry (dl, mask | LDF_READ))
  79.     count++;
  80.  
  81.   UnLockDosList (mask | LDF_READ);
  82.  
  83.   return count;
  84. }
  85.  
  86.  /*
  87.   * CountNodes() zählt die Elemente einer Liste
  88.   */
  89. int
  90. CountNodes (LIST * list)
  91. {
  92.   int count = 0;
  93.   NODE *node;
  94.  
  95.   Forbid ();
  96.   {
  97.     for (node = list->lh_Head; node->ln_Succ; node = node->ln_Succ)
  98.       count++;
  99.   }
  100.   Permit ();
  101.  
  102.   return count;
  103. }
  104.  /*
  105.   * CountNodes() of given type (GMD) 
  106.   */
  107. int
  108. CountNodesType (LIST * list, UBYTE type)
  109. {
  110.   int count = 0;
  111.   NODE *node;
  112.  
  113.   Forbid ();
  114.  
  115.   for (node = list->lh_Head; node->ln_Succ; node = node->ln_Succ)
  116.     {
  117.       if (node->ln_Type == type)
  118.     count++;
  119.     }
  120.  
  121.   Permit ();
  122.  
  123.   return count;
  124. }
  125.  
  126.  
  127.  /*
  128.   * CountMemory() zählt die Memory-Chunks
  129.   */
  130. int
  131. CountMemory (void)
  132. {
  133.   int count = 0;
  134.   NODE *node;
  135.   MEMCHUNK *Loop;
  136.  
  137.   Disable ();
  138.  
  139.   for (node = SysBase->MemList.lh_Head; node->ln_Succ; node = node->ln_Succ)
  140.     {
  141.       count++;
  142.       for (Loop = ((MEMHEADER *) node)->mh_First; Loop; Loop = Loop->mc_Next)
  143.     count++;
  144.     }
  145.  
  146.   Enable ();
  147.  
  148.   return count;
  149. }
  150.  
  151.  /*
  152.   * NoEntries() gibt FALSE zurück, falls keine Einträge zum
  153.   * Anzeigen da sind. In diesem Falle wird das ListView auf
  154.   * dem Hauptfenster initialisiert
  155.   */
  156. int
  157. NoEntries (void)
  158. {
  159.   DPOS;
  160.  
  161.   if (countentries == 0)
  162.     {
  163.       RefreshListView ();
  164.       PrintStatistics ();
  165.  
  166.       return TRUE;
  167.     }
  168.  
  169.   PrintInfo ("Creating list...", NO_SPEAK, 0);
  170.  
  171.   return FALSE;
  172. }
  173.  
  174.  /*
  175.   * RefreshList() erneuert die anzuzeigende Liste im
  176.   * Hauptfenster
  177.   */
  178. void
  179. RefreshList (int type)
  180. {
  181.   DPOS;
  182.  
  183.   if (!SysWnd)
  184.     return;
  185.  
  186.   if (type <= GD_HardwareGad)
  187.     {
  188.       EmptyListView ();
  189.       PrintHeader ((enum ListTypes) type, NULL);
  190.     }
  191.  
  192.   topentry = 0;
  193.  
  194.   if (type < LASTTYPE)
  195.     (*(EntryAttr[type].ea_func)) ();
  196.  
  197.   actualfindnode = GetNode (&ListeLVList, topentry);
  198.   actualfindnodenum = topentry;
  199.  
  200.   PrintStatistics ();
  201.  
  202.   return;
  203. }
  204.  
  205. RSYS_ScrollEntry *SaveEntries = NULL;
  206. LIST SavedList;
  207. int SaveID;
  208. int Savecountentries;
  209.  
  210.  /*
  211.   * SaveCurrentList() speichert die aktuelle Liste im
  212.   * Hauptfenster intern ab.  Diese kann dann wieder
  213.   * eingeladen werden
  214.   */
  215. void
  216. SaveCurrentList (void)
  217. {
  218.   int i;
  219.  
  220.   DPOS;
  221.  
  222.   HandleHelp (MN_SaveCurrentList);
  223.  
  224.   if (SaveEntries && (NOT (Question (SysWnd, "Internal List exist! Do you want create a new list?", YES))))
  225.     {
  226.       PrintStatistics ();
  227.       return;
  228.     }
  229.  
  230.   KillList ();
  231.  
  232.   SaveEntries = (RSYS_ScrollEntry *) MyAllocVec (countentries * sizeof (RSYS_ScrollEntry),
  233.                         MEMF_CLEAR | MEMF_ANY, NO_KILL);
  234.   if (SaveEntries)
  235.     {
  236.       NODE *node = ListeLVList.lh_Head;
  237.  
  238.       NewList (&SavedList);
  239.  
  240.       SaveID = LastID;
  241.       Savecountentries = countentries;
  242.  
  243.       for (i = 0; (i < countentries) && node; i++)
  244.     {
  245.       CopyMem ((APTR) node, (APTR) & (SaveEntries[i].se_Node), sizeof (RSYS_ScrollEntry));
  246.  
  247.       AddTail (&SavedList, &SaveEntries[i].se_Node);
  248.  
  249.       node = node->ln_Succ;
  250.     }
  251.  
  252.       PrintInfo ("Current list saved", SPEAK, SEC);
  253.  
  254.       PrintStatistics ();
  255.     }
  256.  
  257.   return;
  258. }
  259.  
  260.  /*
  261.   * RestoreList() stellt die vorher intern abgespeicherte
  262.   * Liste aus dem Hauptfenster wieder her und erneuert das
  263.   * ListView
  264.   */
  265. void
  266. RestoreList (void)
  267. {
  268.   int i;
  269.  
  270.   DPOS;
  271.  
  272.   HandleHelp (MN_RestoreList);
  273.  
  274.   if (SaveEntries)
  275.     {
  276.       NODE *node = SavedList.lh_Head;
  277.  
  278.       LastID = SaveID;
  279.       countentries = Savecountentries;
  280.  
  281.       PrintHeader ((enum ListTypes) LastID, NULL);
  282.  
  283.       EmptyListView ();
  284.  
  285.       PrintInfo ("Restore saved list", NO_SPEAK, 0);
  286.  
  287.       Entries = AllocScrollEntries (Savecountentries);
  288.  
  289.       for (i = 0; (i < Savecountentries) && node; i++)
  290.     {
  291.       CopyMem ((APTR) node, (APTR) & (Entries[i].se_Node), sizeof (RSYS_ScrollEntry));
  292.  
  293.       Entries[i].se_Node.ln_Name = Entries[i].se_Entry;
  294.  
  295.       AddNodeToList (i, NO_SORT, 0);
  296.  
  297.       node = node->ln_Succ;
  298.     }
  299.  
  300.       RefreshListView ();
  301.  
  302.       PrintInfo ("Previous saved list restored", SPEAK, 0);
  303.     }
  304.   else
  305.     ErrorHandle ("No internal list", LIST_NODE_ERR, SAVED_FAIL, NO_KILL);
  306.  
  307.   return;
  308. }
  309.  
  310.  /*
  311.   * KillList() gibt den Speicher der intern abgespeicherten
  312.   * Liste wieder frei
  313.   */
  314. void
  315. KillList (void)
  316. {
  317.   DPOS;
  318.  
  319.   HandleHelp (MN_KillList);
  320.  
  321.   if (SaveEntries)
  322.     {
  323.       MyFreeVec (SaveEntries);
  324.       SaveEntries = NULL;
  325.  
  326.       PrintInfo ("Last saved list killed", SPEAK, SEC);
  327.       PrintStatistics ();
  328.     }
  329.  
  330.   return;
  331. }
  332.